home *** CD-ROM | disk | FTP | other *** search
- * HRas.s Horizontal Raster
- * 水平ラスタースクロール / 最高速 = 3
- *
- * 注意事項
- * ワイプ中、Timer-C/D を停止します。
- * 音楽演奏しながらワイプする場合、ラスタースクロールに対応した
- * 音源ドライバを使用して下さい( ZMUSIC.X なら ZMUSIC.X -M で常駐して下さい)。
-
-
- SPEED_MAX equ 3
-
- .offset 8 * 引き数
- _source_ptr: .ds.l 1
- _dest_ptr: .ds.l 1
- _speed: .ds.l 1
- _vdisp: .ds.l 1
-
-
-
- .include IOCSCALL.MAC
-
- CRTC_R09 equ $e8_0012 * ラスター割り込み位置
- CRTC_R12 equ $e8_0018 * スクロールX座標
- CRTC_R14 equ $e8_001c
- CRTC_R16 equ $e8_0020
- CRTC_R18 equ $e8_0024
- GPIP_DATA equ $e8_8001
- MFP_IERB equ $e8_8009
- MFP_IMRB equ $e8_8015
-
-
- .offset 0
- scroll_A: * スクロール座標
- .ds.w 2 * (偶数ラスター)
- scroll_B: * スクロール座標
- .ds.w 2 * (奇数ラスター)
- old_mfp_ierb:
- .ds.b 1 * MFP レジスタ退避用
- old_mfp_imrb:
- .ds.b 1
-
- .even
- raster_num: * 割り込むラスター
- .ds.w 1 * CRTC_R09 に入れる値
- .even
- WORKSIZE:
-
-
- .text
- .even
-
- .dc.b 'WL10',$0d,$0a
- .dc.b '水平ラスタースクロール / 最高速 = 3',$0d,$0a
- .dc.b ' by Mitsuky',$0d,$0a
- .dc.b $1a
-
- .even
- HRas:
- link a6,#0
- movem.l d1-d7/a0-a5,-(sp)
-
- move.l _speed(a6),d0 * d0.w =
- bmi main_ask_speed
- cmpi.l #SPEED_MAX,d0
- bhi main_err
-
- tst.l _vdisp(a6)
- bmi main_ask_vdisp
-
-
- lea.l work(pc),a0
- move.b MFP_IERB,old_mfp_ierb(a0) * MFP のレジスタを保存
- move.b MFP_IMRB,old_mfp_imrb(a0)
- andi.b #$cf,MFP_IERB * Timer - C / D 停止
- andi.b #$cf,MFP_IMRB * 〃 マスク
-
-
- lea.l work(pc),a0
- clr.w scroll_A(a0) * スクロールX座標
- clr.w scroll_B(a0) *
- clr.w raster_num(a0) * 割り込むラスター
-
- bsr vdisp
-
- moveq.l #40,d1
- lea.l hsync_routine(pc),a1
- IOCS _CRTCRAS
- tst.l d0
- bne main_err
-
- movea.l _source_ptr(a6),a1 * a1.l = 転送元アドレス・その1
- movea.l _dest_ptr(a6),a2 * a2.l = 転送先アドレス・その1
-
- move.l _speed(a6),d0 * d0.w =
- lea.l jump_table(pc),a0
- add.w d0,d0
- move.w (a0,d0.w),d0
- jmp (a0,d0.w)
-
- main_rts:
- suba.l a1,a1
- IOCS _CRTCRAS
-
- lea.l work(pc),a0
- move.b old_mfp_ierb(a0),MFP_IERB
- move.b old_mfp_imrb(a0),MFP_IMRB
-
- moveq.l #0,d0
- move.w d0,CRTC_R12
- move.w d0,CRTC_R14
- move.w d0,CRTC_R16
- move.w d0,CRTC_R18
- moveq.l #0,d0
- main_rts_2:
- movem.l (sp)+,d1-d7/a0-a5
- unlk a6
- rts
-
-
- **** ****
- main_err:
- moveq.l #-1,d0
- bra main_rts_2
-
-
- **** ****
- main_ask_speed:
- moveq.l #SPEED_MAX,d0
- bra main_rts_2
-
-
- **** ****
- main_ask_vdisp:
- move.l _speed(a6),d0
- lea.l ask_vdisp_table(pc),a0
- add.w d0,d0
- move.w (a0,d0.w),d0
- bra main_rts_2
-
- ask_vdisp_table:
- .dc.w 512+1,256+1,128+1,64+1
-
-
- **** ****
- jump_table:
- .dc.w s0-jump_table
- .dc.w s1-jump_table
- .dc.w s2-jump_table
- .dc.w s3-jump_table
-
-
- **** ****
- vdisp:
- movem.l a0,-(sp)
- move.l _vdisp(a6),a0
- jsr (a0)
- movem.l (sp)+,a0
- rts
-
-
- **** ****
- hsync_routine:
- movem.l d0/a0,-(sp)
- * move.w sr,-(sp)
- * ori.w #$0700,sr
-
- lea.l work(pc),a0
- move.w raster_num(a0),d0
- addq.w #1,d0
- andi.w #511,d0
- move.w d0,raster_num(a0)
- addi.w #40,d0
- move.w d0,CRTC_R09
-
- lsr.w d0
- bcc hsync_routine_B * 偶数ラスターなら
-
- move.w scroll_A(a0),d0 * d0.l = スクロール座標
- move.w d0,CRTC_R12
- move.w d0,CRTC_R14
- move.w d0,CRTC_R16
- move.w d0,CRTC_R18
- bra hsync_routine_rts
- hsync_routine_B:
- move.w scroll_B(a0),d0 * d0.l = スクロール座標
- move.w d0,CRTC_R12
- move.w d0,CRTC_R14
- move.w d0,CRTC_R16
- move.w d0,CRTC_R18
- hsync_routine_rts:
- * move.w (sp)+,sr
- movem.l (sp)+,d0/a0
- rte
-
-
- *********************************************************
- s0: * 速度0の時
- lea.l 512*2(a1),a3 * a3.l = 転送元アドレス・その2
- lea.l 512*2(a2),a4 * a4.l = 転送先アドレス・その2
- lea.l (512-1)*2(a1),a1 * a1.l = 転送元アドレス・その1
- lea.l (512-1)*2(a2),a2 * a2.l = 転送先アドレス・その1
- move.l #1024*512+1*2,d4
- move.l #1024*512-1*2,d5
-
- move.w #512-1,d7
- s0_loop_x:
- bsr vdisp
-
- lea.l work(pc),a0
- move.w d7,scroll_A(a0)
- move.w #512,d0
- sub.w d7,d0
- move.w d0,scroll_B(a0)
-
- move.w #512/2-1,d6
- s0_loop_y:
- move.w (a1),(a2)
- move.w (a3),(a4)
- lea.l 2048(a1),a1
- lea.l 2048(a2),a2
- lea.l 2048(a3),a3
- lea.l 2048(a4),a4
- dbra d6,s0_loop_y
-
- suba.l d4,a1
- suba.l d4,a2
- suba.l d5,a3
- suba.l d5,a4
- dbra d7,s0_loop_x
-
- bra main_rts
-
- **** ****
- s1: * 速度1の時
- lea.l 512*2(a1),a3 * a3.l = 転送元アドレス・その2
- lea.l 512*2(a2),a4 * a4.l = 転送先アドレス・その2
- lea.l (512-2)*2(a1),a1 * a1.l = 転送元アドレス・その1
- lea.l (512-2)*2(a2),a2 * a2.l = 転送先アドレス・その1
- move.l #1024*512+2*2,d4
- move.l #1024*512-2*2,d5
-
- move.w #512-2,d7
- s1_loop_x:
- bsr vdisp
-
- lea.l work(pc),a0
- move.w d7,scroll_A(a0)
- move.w #512,d0
- sub.w d7,d0
- move.w d0,scroll_B(a0)
-
- move.w #512/2-1,d6
- s1_loop_y:
- move.l (a1),(a2)
- move.l (a3),(a4)
- lea.l 2048(a1),a1
- lea.l 2048(a2),a2
- lea.l 2048(a3),a3
- lea.l 2048(a4),a4
- dbra d6,s1_loop_y
-
- suba.l d4,a1
- suba.l d4,a2
- suba.l d5,a3
- suba.l d5,a4
-
- subq.w #2,d7
- bpl s1_loop_x
-
- bra main_rts
-
-
- **** ****
- s2: * 速度2の時
- lea.l 512*2+8(a1),a3 * a3.l = 転送元アドレス・その2
- lea.l 512*2+8(a2),a4 * a4.l = 転送先アドレス・その2
- lea.l (512-4)*2(a1),a1 * a1.l = 転送元アドレス・その1
- lea.l (512-4)*2(a2),a2 * a2.l = 転送先アドレス・その1
- move.l #1024*512+4*2,d4
- move.l #1024*512-4*2,d5
-
- move.w #512-4,d7
- s2_loop_x:
- bsr vdisp
-
- lea.l work(pc),a0
- move.w d7,scroll_A(a0)
- move.w #512,d0
- sub.w d7,d0
- move.w d0,scroll_B(a0)
-
- move.w #512/2-1,d6
- s2_loop_y:
- move.l (a1)+,(a2)+
- move.l (a1)+,(a2)+
- lea.l 2048-8(a1),a1
- lea.l 2048-8(a2),a2
- move.l -(a3),-(a4)
- move.l -(a3),-(a4)
- lea.l 2048+8(a3),a3
- lea.l 2048+8(a4),a4
- dbra d6,s2_loop_y
-
- suba.l d4,a1
- suba.l d4,a2
- suba.l d5,a3
- suba.l d5,a4
-
- subq.w #4,d7
- bpl s2_loop_x
-
- bra main_rts
-
-
- **** ****
- s3: * 速度3の時
- lea.l 512*2+16(a1),a3 * a3.l = 転送元アドレス・その2
- lea.l 512*2+16(a2),a4 * a4.l = 転送先アドレス・その2
- lea.l (512-8)*2(a1),a1 * a1.l = 転送元アドレス・その1
- lea.l (512-8)*2(a2),a2 * a2.l = 転送先アドレス・その1
- move.l #1024*512+8*2,d4
- move.l #1024*512-8*2,d5
-
- move.w #512-8,d7
- s3_loop_x:
- bsr vdisp
-
- lea.l work(pc),a0
- move.w d7,scroll_A(a0)
- move.w #512,d0
- sub.w d7,d0
- move.w d0,scroll_B(a0)
-
- move.w #512/2-1,d6
- s3_loop_y:
- move.l (a1)+,(a2)+
- move.l (a1)+,(a2)+
- move.l (a1)+,(a2)+
- move.l (a1)+,(a2)+
- lea.l 2048-16(a1),a1
- lea.l 2048-16(a2),a2
- move.l -(a3),-(a4)
- move.l -(a3),-(a4)
- move.l -(a3),-(a4)
- move.l -(a3),-(a4)
- lea.l 2048+16(a3),a3
- lea.l 2048+16(a4),a4
- dbra d6,s3_loop_y
-
- suba.l d4,a1
- suba.l d4,a2
- suba.l d5,a3
- suba.l d5,a4
-
- subq.w #8,d7
- bpl s3_loop_x
-
- bra main_rts
-
- *********************************************************
- work:
- .ds.b WORKSIZE
- .even
-